package Log

import (
	_ "github.com/go-sql-driver/mysql"
)

//
//const (
//	mysqlConnStr = "username:password@tcp(host:port)/database"
//	esURL        = "http://localhost:9200"
//)
//
//func main() {
//	err := syncMysqlToEs()
//	if err != nil {
//		log.Fatal(err)
//	}
//}
//
//func syncMysqlToEs() error {
//
//	// 获取 MySQL 中的所有日志
//	var mysqlLogs []models.Logs
//	err := DAO.Engine.Find(&mysqlLogs)
//
//	// 连接 Elasticsearch
//	esClient, err := elasticsearch.NewClient(elasticsearch.Config{
//		Addresses: []string{esURL},
//	})
//	if err != nil {
//		return fmt.Errorf("failed to connect to Elasticsearch: %v", err)
//	}
//
//	// 获取 Elasticsearch 中的所有日志 ID
//	esQuery := map[string]interface{}{
//		"query": map[string]interface{}{
//			"match_all": map[string]interface{}{},
//		},
//	}
//	// 将查询转换为 JSON 字节切片，并创建一个字节切片的读取器
//	queryJSON, err := json.Marshal(esQuery)
//	if err != nil {
//		return fmt.Errorf("failed to marshal Elasticsearch query: %v", err)
//	}
//
//	// 使用 bytes.NewReader 创建一个读取器
//	queryReader := bytes.NewReader(queryJSON)
//	res, err := esClient.Search(
//		esClient.Search.WithIndex("your_logs_index"),
//		esClient.Search.WithBody(queryReader), // 使用 queryReader 而不是 json.NewReader(queryJSON)
//		esClient.Search.WithSize(10000),
//	)
//	if err != nil {
//		return fmt.Errorf("failed to query Elasticsearch logs: %v", err)
//	}
//	defer res.Body.Close()
//
//	esLogIDs := make(map[int]struct{})
//	var esHits struct {
//		Hits struct {
//			Hits []struct {
//				Source json.RawMessage `json:"_source"`
//			} `json:"hits"`
//		} `json:"hits"`
//	}
//	err = json.NewDecoder(res.Body).Decode(&esHits)
//	if err != nil {
//		return fmt.Errorf("failed to decode Elasticsearch response: %v", err)
//	}
//	for _, hit := range esHits.Hits.Hits {
//		var esLog models.Logs
//		err := json.Unmarshal(hit.Source, &esLog)
//		if err != nil {
//			return fmt.Errorf("failed to unmarshal Elasticsearch log: %v", err)
//		}
//		esLogIDs[esLog.Id] = struct{}{}
//	}
//
//	// 同步数据到 Elasticsearch
//	for _, log := range mysqlLogs {
//		exists := false
//		if _, ok := esLogIDs[log.Id]; ok {
//			exists = true
//		}
//		if exists {
//			// 更新操作
//			logJSON, err := json.Marshal(log)
//			if err != nil {
//				return fmt.Errorf("failed to marshal log for update: %v", err)
//			}
//			// 注意：这里假设 esClient.Update 方法接受 []byte 或 string 作为文档数据
//			// 如果它接受 io.Reader，你需要使用 bytes.NewReader(logJSON)
//			res, err := esClient.Update(
//				"your_logs_index",
//				fmt.Sprintf("%d", log.Id),
//				strings.NewReader(string(logJSON)), // 或者直接使用 logJSON（如果 Update 方法接受 []byte）
//				// 可能还需要传递其他参数，如脚本或更新操作
//			)
//			if err != nil {
//				return fmt.Errorf("failed to update Elasticsearch log with id %d: %v", log.Id, err)
//			}
//			defer res.Body.Close()
//			// 检查响应状态（如果需要）
//		} else {
//			// 插入操作
//			logJSON, err := json.Marshal(log)
//			if err != nil {
//				return fmt.Errorf("failed to marshal log for insert: %v", err)
//			}
//			// Index 方法通常也接受 []byte 或 string
//			res, err := esClient.Index(
//				"your_logs_index",
//				string(logJSON), // 或者直接使用 logJSON（如果 Index 方法接受 []byte）
//				esClient.Index.WithDocumentID(fmt.Sprintf("%d", log.Id)),
//			)
//			if err != nil {
//				return fmt.Errorf("failed to insert Elasticsearch log with id %d: %v", log.Id, err)
//			}
//			defer res.Body.Close()
//			// 检查响应状态（如果需要）
//		}
//	}
//
//	// 删除 ES 中不存在于 MySQL 的数据
//	for esLogID := range esLogIDs {
//		found := false
//		for _, mysqlLog := range mysqlLogs {
//			if mysqlLog.Id == esLogID {
//				found = true
//				break
//			}
//		}
//		if !found {
//			res, err := esClient.Delete(
//				"your_logs_index",
//				fmt.Sprintf("%d", esLogID),
//			)
//			if err != nil {
//				return fmt.Errorf("failed to delete Elasticsearch log with id %d: %v", esLogID, err)
//			}
//			defer res.Body.Close()
//		}
//	}
//
//	return nil
//}
